package www.openteam.com.network;

import java.io.IOException;

import okhttp3.MediaType;
import okhttp3.ResponseBody;
import okio.Buffer;
import okio.BufferedSource;
import okio.ForwardingSource;
import okio.Okio;
import okio.Source;

/**
 * Created by kylin on 2017/2/27.
 */

public class DownloadProgressResponseBody extends ResponseBody {

    private ResponseBody responseBody;
    private DownloadProgressListener progressListener;
    private BufferedSource bufferedSource;

    public DownloadProgressResponseBody(ResponseBody responseBody, DownloadProgressListener progressListener) {
        this.responseBody = responseBody;
        this.progressListener = progressListener;
    }

    @Override
    public MediaType contentType() {
        return responseBody.contentType();
    }

    @Override
    public long contentLength() {
        return responseBody.contentLength();
    }

    @Override
    public BufferedSource source() {
        if (bufferedSource ==null){
            bufferedSource = Okio.buffer(source(responseBody.source()));
        }
        return bufferedSource;
    }


    private Source source (Source source ){
        return new ForwardingSource(source) {
            long totalBytesRead =0L;
            @Override
            public long read(Buffer sink, long byteCount) throws IOException {
                Long bytesRead =super.read(sink, byteCount);
                //read() returns the number of bytes read ,or -1 if this sources is exhausted
                totalBytesRead += bytesRead !=-1? bytesRead:0;

                if (null != progressListener){
                    progressListener.update(totalBytesRead,responseBody.contentLength(),bytesRead ==-1);
                }
                return  bytesRead;
            }
        };
    }
}
